<?php
namespace app\modules\test\models;

use app\libs\Pager;
use yii\db\ActiveRecord;
use yii\rest\ViewAction;

class TestAnswer extends ActiveRecord
{

    public static function tableName()
    {
        return '{{%test_answer}}';
    }

    public static function getSuggest($score, $type)
    {
        $data = array();
        if ($type != 21) {
            if ($score < 5.5) {
                $data[0] = '40-50课时';
                $data[1] = '需要重点提升听力基础、辨音、题型解题技巧等方面的能力。需要保持每天至少1-2个小时及以上的听力练习时间';
                $data[2] = '重点提升基础词汇，句子结构分析，最终过渡到长难句分析并结合课上讲解的解题方法达到能力的综合提升';
                $data[3] = '着重强化基础汉译英技能，在能够合理疏通句意的基础上写出正确的、地道的英语句子。另外加强对于雅思写作文章结构的认知，培养逻辑感，增强文章论述的说服力；
加强语法知识的积累，补足现有语法体系中的短板。重心更倾向于逻辑方面，强化审题破题、文章逻辑连接和连贯方面的技巧。';
            } elseif ($score < 6.5) {
                $data[0] = '30-40课时';
                $data[1] = '需要重点提升听力基础、辨音、题型解题技巧等方面的能力。需要保持每天至少1-2个小时及以上的听力练习时间；';
                $data[2] = '需要着重补充词汇词性判断，断句、长难句分析等翻译策略。阅读需要保持每天练习长难句分析，每天需要完成一篇阅读文章；';
                $data[3] = '补充雅思写作中常用的一些句型，以及长难句的构造方法，以解决语法方面的问题。';
            } else {
                $data[0] = '30课时左右';
                $data[1] = '需要重点提升听力基础、辨音、题型解题技巧等方面的能力。需要保持每天至少1-2个小时及以上的听力练习时间';
                $data[2] = '需要重点提升基础阅读能力、长难句分析、答题策略、文章信息整合能力等。阅读科目需每天保持练习，前期可适当每天完成5个长难句练习，掌握句子分析策略；后期强化，冲刺阶段每天至少完成一个test。重点在于提升阅读能力、解题方法、阅读思维转换。';
                $data[3] = '找一份你喜欢的且适合你的逻辑链结构，然后反复练习。小作文务必注意不要出现像generally speaking这样的表述；大作文中很强调的是“对比”，你的观点要明确，不建议使用模棱两可的表述。';
            }
        } else {
            if ($score <= 5.5) {
                $data[0] = '22课时';
                $data[1] = '同学口语需要在流利度，语法上面先做好提高，然后才是解决词汇句型丰富度方面；
现在需要学习句法，能把句子表达得语法不错，同时需要学习发音的知识，所以规划基础段课时22节，后续我们规划雅思基础课8-12课时，以及强化课8-12课时；提升重点就是打地基，不出现基础错误，例如第三人称单数问题，过去时等问题；然后表达需要清晰，考官听着不费力。';
            } elseif ($score <= 6.5) {
                $data[0] = '18课时';
                $data[1] = '同学总体流利度比较好，你单词发音没有问题，但是存在使用的词汇和句型都是停留在舒适区，也就是绝大多数是初、中阶段的词汇和句型，那我们雅思阶段需要更复杂的词汇和句型。而且在语法的准确性上还需要得到提升；
      这个阶段的课时规划大概为16到20课时。课时构成主要是从part one到part three，分别都会有四到五个课时，然后再加上我们刚才提到的句型复杂度的词汇复杂度的训练；
      第一不仅要注意语音，还要注意语调，突破的重点在语调的训练。第二，把简单的词汇和句型进行升级迭代，这个是要抓的一个重点。其次就是在流利度上进一步提升，还可以把语速提升，因为高分段的同学语速都是很快的。';
            } else {
                $data[0] = '14课时';
                $data[1] = ' 同学的基础比较好，能够听出语音语调流利度都不错，也在努力的用更好的词和句。但是我们要达到6.5和7的口语，还需要在词、句的难度和长度上面进行加强，同时替换的力度也要增强，可以用一些地道的短语，这个就是使我们的表达更倾向于西方人士；
      这个阶段的课时规划大概为12到14课时。课时构成主要是从part one到part three，分别都会有三到四个课时，然后再加上我们刚才提到的句型复杂度的词汇复杂度的训练；
      我们这里提升的板块主要是词汇的丰富性，是否能用至少三种表达方式表达同一件事情；第二就是我们句型的丰富性，是否能够很顺畅的使用倒装句、虚拟语气以及各种从句；第三就是我们的地道性，是否能够用西方人习惯使用的表达法；这是我们要提升的几个板块。';
            }
        }
        return $data;
    }

    public static function getScore($right, $count)
    {
        $rate = $right != 0 ? ($right / $count) * 100 : 0;
        if ($rate <= 5) {
            $score = 5;
        } elseif ($rate <= 15) {
            $score = 10;
        } elseif ($rate <= 20) {
            $score = 15;
        } elseif ($rate <= 25) {
            $score = 20;
        } elseif ($rate <= 30) {
            $score = 25;
        } elseif ($rate <= 35) {
            $score = 30;
        } elseif ($rate <= 40) {
            $score = 35;
        } elseif ($rate <= 45) {
            $score = 40;
        } elseif ($rate <= 50) {
            $score = 45;
        } elseif ($rate <= 55) {
            $score = 50;
        } elseif ($rate <= 65) {
            $score = 55;
        } elseif ($rate <= 70) {
            $score = 60;
        } elseif ($rate <= 75) {
            $score = 65;
        } elseif ($rate <= 80) {
            $score = 70;
        } elseif ($rate <= 85) {
            $score = 75;
        } elseif ($rate <= 90) {
            $score = 80;
        } elseif ($rate < 100) {
            $score = 85;
        } else {
            $score = 100;
        }
        return $score / 10;
    }

    /**
     * @数量
     * @Author yoyo
     * @Date   2021-12-22
     */
    public function getTestDetail($data)
    {
        $uid = \Yii::$app->session->get('uid');
        static $arr = array();
        static $score = 0;
        static $totalCorrect = 0;
        static $total = 0;
        $subjects = explode(',', $data['subjectId']);
        $count = count($subjects);
        foreach ($subjects as $key => $val) {
            //每一部分的题目
            $cate = TestCate::find()->asArray()->where('id=' . $val)->one();
            $question = TestListDetail::find()->asArray()->select('tld.*,tl.questionType')->from('x2_test_list_detail tld')->leftJoin('x2_test_list tl', 'tl.id=tld.pid')->where('cateId=' . $data['cateId'] . ' and subjectId=' . $val)->all();//题目
            array_multisort(array_column($question,'name'),SORT_ASC,$question);
            $answer = TestAnswer::find()->asArray()->where('pub_id=' . $data['id'] . ' and uid=' . $uid . ' and question_id in(' . implode(',', array_column($question, 'id')) . ')')->all();//每个科目的做题数据
            if ($cate['type'] == 8 || $cate['type'] == 9) {//口语记录平均分
                $totalOne = $correct = 0;
                $spokenScore = array_sum(array_column($answer, 'score')) / count($answer);//各科目的分数
                if ($spokenScore >= 9) {
                    $arr['detail'][$key]['result']['score'] = 9;
                } else {
                    $point = $spokenScore - floor($spokenScore);
                    if ($point < 0.25) {
                        $arr['detail'][$key]['result']['score'] = floor($spokenScore);
                    } elseif ($point < 0.75 && $point >= 0.25) {
                        $arr['detail'][$key]['result']['score'] = floor($spokenScore) + 0.5;
                    } else {
                        $arr['detail'][$key]['result']['score'] = ceil($spokenScore);
                    }
                }
                $arr['detail'][$key]['result']['rate'] = '';
            } elseif ($cate['type'] == 4) {//写作直接返回
                $arr['detail'][$key]['result'] = json_decode($answer[0]['remark'], true);
                $arr['detail'][$key]['result']['score'] = $answer[0]['score'];
                $arr['detail'][$key]['result']['rate'] = '';
                $totalOne = $correct = 0;
            } elseif ($cate['type'] == 5 || $cate['type'] == 7) {//翻译
                $count = $count - 1;
                $arr['detail'][$key]['result']['score'] = 0;
                $arr['detail'][$key]['result']['rate'] = '';
                $totalOne = $correct = 0;
            } else {//其他的直接判断正确数
                $correct = isset(array_count_values(array_column($answer, 'result'))[1]) ? array_count_values(array_column($answer, 'result'))[1] : 0;
                $arr['detail'][$key]['result']['rate'] = round($correct / count($answer) * 100, 2);
                $arr['detail'][$key]['result']['score'] = self::getScore($correct, count($answer));
                $totalOne = count($answer);
            }
            $arr['detail'][$key]['subjectName']=$cate['name'];
            foreach ($question as $k => $v) {
                $userAnswer = TestAnswer::find()->asArray()->where('question_id=' . $v['id'] . ' and pub_id=' . $data['id'] . ' and uid=' . $uid)->one();
                $question[$k]['userAnswer'] = $userAnswer != false ? $userAnswer['answer'] : '';
                $question[$k]['remark'] = $userAnswer != false ? $userAnswer['remark'] : '';
                if ($cate['type'] == 7) {
                    $question[$k]['trueAnswer']= explode(';',$v['answer']);
                }
            }
            $totalCorrect += $correct;
            $total += $totalOne;
            $score += $arr['detail'][$key]['result']['score'];
            $arr['detail'][$key]['result']['question'] = $question;
            $arr['paperId'] = $cate['pid'];
        }
        $totalScore = round($score / $count);
        $arr['suggest'] = self::getSuggest($totalScore, $data['cateId']);
        $arr['time'] = $data['endTime'] != false ? floor(($data['endTime'] - $data['startTime']) / 60) . '分' . (($data['endTime'] - $data['startTime']) % 60) . '秒' : 0;
        $arr['score'] = $totalScore != false ? $totalScore : 0;
        $arr['rate'] = floor($totalCorrect / $total * 100);
        return $arr;
    }
}
